import redis
import yaml
import json
import schedule
import os
import time
from typing import List
from sctftqq import sc_send as ft_sc_send

# 获取当前脚本所在目录
script_dir = os.path.dirname(os.path.abspath(__file__))
# 组合成绝对路径
config_path = os.path.join(script_dir, "local_config.yaml")

class Watchdog:
    def __init__(self):
        self.config = self.load_config()
        self.redis = self.connect_redis()
        self.watch_list: List[str] = self.config["watch_list"]

    @staticmethod
    def load_config():
        with open(config_path) as f:
            return yaml.safe_load(f)

    def connect_redis(self):
        return redis.Redis(**self.config["redis"])

    def check_dog(self, dog_name: str):
        """检查单个服务的状态"""
        current_status = self.redis.get(dog_name)

        if not current_status:  # 键不存在或已过期
            print(f"[ALERT] {dog_name} 服务失联！")
            self.redis.set(
                name=dog_name,
                value="死机",
                ex=28800  # 8小时TTL
            )
            self.handle_crash(dog_name,msg = f"[ALERT] {dog_name} 服务失联！")
        elif current_status == "死机":
            print(f"[WARNING] {dog_name} 仍处于死机状态")
        else:
            print(f"[OK] {dog_name} 运行正常")

    def handle_crash(self, dog_name: str,msg: str):
        """预留的故障处理接口"""
        # 这里可以添加邮件通知、自动重启等逻辑
        wechatbot = {"sendmode": "wechat",
                     "msgobj": "single",
                     "who": "丁鹏",
                     "msg": "这是一条测试消息",
                     "file": "",
                     "at": ""}
        wechatbot["msg"] = msg

        #self.redis.lpush('wechatbot',json.dumps(wechatbot,ensure_ascii=False))

        ft_sc_send('后台程序中断提醒',msg)#通过方糖的server酱通知到微信上，不要通过原来的redis推送消息了

        print(f"[ACTION] 正在处理 {dog_name} 的故障...")

    def run(self):
        """启动监控循环，启动一个无限循环,每20秒执行一次check_all()检查。使用schedule库进行定时任务调度,time.sleep(1)控制循环间隔。
    Args:
        self: 当前实例对象
    Returns:
        None
    运行流程:
    1. 打印启动提示信息
    2. 设置每30秒执行一次check_all()检查
    3. 进入无限循环,运行待执行的定时任务
    4. 每次循环休眠1秒钟控制执行频率
    """
        print("看门狗程序已启动 (◍•ᴗ•◍)")
        schedule.every(30).seconds.do(self.check_all)
        while True:
            schedule.run_pending()
            time.sleep(1)

    def check_all(self):
        """检查所有监控的服务"""
        print("\n=== 开始本轮检查 ===")
        self.watch_list = self.redis.lrange('watchdog_key',0,-1) #从redis中读取要检查的列表
        for dog in self.watch_list:
            self.check_dog(dog)
        print("=== 检查完成 ===\n")

if __name__ == "__main__":
    wd = Watchdog()
    wd.run()